from odoo import models, fields, api
from odoo.exceptions import ValidationError


# 向模型添加等级
class BookCategory(models.Model):
    _name = 'library.book.category'
    name = fields.Char('分类')
    parent_id = fields.Many2one('library.book.category', string='父类别', ondelete='restrict', index=True)
    child_ids = fields.One2many('library.book.category', 'parent_id', string='子类别')
    '''
    添加一个帮助字段parent_path及设置模型属性为 _parent_store=True来实现快速的数据浏览
    '''
    _parent_store = True
    _parent_name = "parent_id"
    parent_path = fields.Char(index=True)

    # 添加如下行来新增一个防止循环关联的检查
    @api.constrains('parent_id')
    def _check_hierarchy(self):
        if not self._check_recursion():
            raise models.ValidationError('Error! You cannot create recursive categories.')

    # 新增记录
    def create_categories(self):
        cate1 = {
            'name': 'Child category 1',
            'description': 'Description for child 21'
        }
        cate2 = {
            'name': 'Child category 2',
            'description': 'Description for child 2'
        }
        parent_category_val = {
            'name': 'Parent category',
            'email': 'Description fir parent category',
            'child_ids': [
                (0, 0, cate1),
                (0, 0, cate2)
            ]
        }
        #         调用create()方法来新建记录
        record = self.env['library.book.category'].create(parent_category_val)

    # 更新记录值
    # 方式一
    @api.multi
    def change_update_date(self):
        '''
        通过调用ensure_one()检查以self传递的图书记录是否是一条记录。如并非如此该方法会抛出一个异常，并停止处理。需要这么做是因为我们不希望修改多条记录的日期。如果你想要更新多条值，可以删除ensure_one()并使用对记录集的循环来更新该属性。

        :return:
        '''
        self.ensure_one()
        self.date_updated = fields.Datetime.now()

    #     方式二
    # @api.multi
    # def change_update_date(self):
    #     self.ensure_one()
    #     self.update({
    #         'date_updated': fields.Datetime.now(),
    #         'another_fields': 'value',
    #     })
